package com.rrt.service.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.rrt.domain.Equipo;
import com.rrt.domain.EventoDeportivo;
import com.rrt.domain.MensajeTopic;
import com.rrt.service.MensajeTopicService;
import com.rrt.util.Config;
import com.rrt.util.Util;

@Service("MensajeTopicService")
public class MensajeTopicServiceImpl implements MensajeTopicService {
	private static final Logger logger = LoggerFactory.getLogger(MensajeTopicServiceImpl.class);
	@Autowired
	private JmsTemplate jmsTemplate;
	private static Gson gson = new Gson();
	
	public void enviarMensajeEnCola(final MensajeTopic mensaje) {	
			
		jmsTemplate.send(new MessageCreator() {
			public Message createMessage(Session session) throws JMSException {
				TextMessage textMessage = session.createTextMessage();	
				String gsonstr = gson.toJson(mensaje);
				logger.info("Send message:"+gsonstr);
				textMessage.setText(gsonstr);	
				return textMessage;
			}
		});
	}
	
	@Override
	public MensajeTopic enviarMensaje(int idEvento, String txtMensajes) {
		logger.info("Enviando idEvento:"+idEvento + "  txtMensajes:"+txtMensajes);	
		MensajeTopic mensajeTopic = new MensajeTopic();
		mensajeTopic.setIdEvento(idEvento);
		EventoDeportivo eventodeportivo= eventoEnCurso(idEvento);
		if(eventodeportivo==null){
			mensajeTopic.setTipo(1);
			mensajeTopic.setMensaje("El evento aun esta disponible.");
			return mensajeTopic;
		}
		Map<String, Equipo> mapEquipos = obtenerEquipoPorEvento(eventodeportivo) ;
		Equipo equipoUno = mapEquipos.get("equipoUno");
		Equipo equipoDos = mapEquipos.get("equipoDos");
		
		String tituloEvento = eventodeportivo.getDescripcion();
		String equiposEnfrentados = equipoUno.getNombre() +" - " + equipoDos.getNombre();
		mensajeTopic.setTipo(2);
		mensajeTopic.setTitulo(tituloEvento);
		mensajeTopic.setDescrpEvento(equiposEnfrentados);
		mensajeTopic.setMensaje(txtMensajes);	
		try {
			enviarMensajeEnCola(mensajeTopic);			
		} catch (Exception e) {
			logger.error("Error al envio",e);
		}
		return mensajeTopic;
	}
	
	private Map<String, Equipo> obtenerEquipoPorEvento(
			EventoDeportivo eventodeportivo) {			
		try {
			String objetoRest = Util.restUtilGet(Config.getPropiedad("hhtp.rest.equipo")+eventodeportivo.getIdEvento(), "GET", "Accept", "application/json");
			logger.info("objetoRest:"+objetoRest);	
			List<Equipo> equipos = gson.fromJson(objetoRest, new TypeToken<List<Equipo>>(){}.getType());	
		
			Map<String, Equipo>  equp = new HashMap<String, Equipo>();
			equp.put("equipoUno", equipos.get(0));
			equp.put("equipoDos", equipos.get(1));
			return equp;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	private EventoDeportivo eventoEnCurso(int idEvento) {
		try {
			String objetoRest = Util.restUtilGet(Config.getPropiedad("hhtp.rest.evento")+idEvento, "GET", "Accept", "application/json");
			logger.info("objetoRest:"+objetoRest);	
			EventoDeportivo evenot =  gson.fromJson(objetoRest,EventoDeportivo.class);				
			if(evenot!=null){
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
				
				try {
					Date dateNow = new Date();
					Date date = sdf.parse(evenot.getFechaInicio());
					long fechanow = dateNow.getTime();
					long fechaInicial = date.getTime();					
					Date datefinal = sdf.parse(evenot.getFechaFinEvent());
					long fechaFin = datefinal.getTime();		

					long diferencia = fechanow - fechaInicial;
					long diferenciaDespues = fechanow - fechaFin;
					logger.info("Enviando diferencia:"+diferencia + "  diferenciaDespues:"+diferenciaDespues);	
//					if(diferencia>0 && diferenciaDespues<0 ){
						return evenot;						
//					}					
				} catch (ParseException e) {
					e.printStackTrace();
				}
				
				
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
